package pers.jg.rrsserver.service

import com.aliyun.dysmsapi20170525.Client
import com.aliyun.dysmsapi20170525.models.SendSmsRequest
import com.aliyun.tea.TeaException
import com.aliyun.teaopenapi.models.Config
import com.aliyun.teautil.Common
import com.aliyun.teautil.Common.toJSONString
import com.aliyun.teautil.models.RuntimeOptions
import org.springframework.stereotype.Service
import java.util.*
import kotlin.collections.ArrayList


@Service
class TelCodeService {

    class TelCode(var tel: String, var code: String) {
        var time: Date = Date()

        init {
            this.time = Date()
        }
    }

    val telCodeList = ArrayList<TelCode>()

    @Throws(Exception::class)
    fun createClient(): Client {
        // 通过系统环境变量获取阿里云密钥
        val config = Config() // 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
            .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
            .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
        config.endpoint = "dysmsapi.aliyuncs.com"
        return Client(config)
    }

    @Throws(java.lang.Exception::class)
    fun sendTo(tel: String): TelCode {
        // 生成4位数字验证码
        var numberCode = (Math.random() * 10000).toInt()
        if (numberCode < 1000) {
            numberCode += 1000
        }
        val telCode = TelCode(tel, numberCode.toString())
        val client: Client = createClient()
        //  生成验证码请求并发送短信
        val sendSmsRequest = SendSmsRequest()
            .setPhoneNumbers(telCode.tel)
            .setSignName("乡兴助农")
            .setTemplateCode("SMS_314850734")
            .setTemplateParam("{\"code\":\"${telCode.code}\"}")
        val runtime = RuntimeOptions()
        try {
            val sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime)
            println(toJSONString(sendSmsResponse))
            // 添加到map中
            telCodeList.add(telCode)
            for (telCode in telCodeList) {
                println(telCode.tel)
                println(telCode.code)
                println(telCode.time)
            }
            return telCode
        } catch (error: TeaException) {
            // 此处仅做打印展示，请谨慎对待异常处理，在工程项目中切勿直接忽略异常。
            // 错误 message
            println(error.message)
            // 诊断地址
            println(error.getData()["Recommend"])
            Common.assertAsString(error.message)
        } catch (error: java.lang.Exception) {
            val error = TeaException(error.message, error)
            // 此处仅做打印展示，请谨慎对待异常处理，在工程项目中切勿直接忽略异常。
            // 错误 message
            println(error.message)
            // 诊断地址
            println(error.getData()["Recommend"])
            Common.assertAsString(error.message)
        }
        return telCode
    }

    /**
     * 验证验证码是否正确
     * @param tel 手机号
     * @param code 验证码
     * @return 是否正确
     */
    fun validateCode(tel: String, code: String): Boolean {
        // 从map中获取是否存在对应的验证码
        for (telCode in telCodeList) {
            // 查询到的手机号和验证码，且验证码未超过60秒
            if (telCode.tel == tel && telCode.code == code && Date().time - telCode.time.time < 60000) {
                return true
            }
        }
        return false
    }
}